home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / plugin / PluginClassLoader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  3.4 KB  |  149 lines

  1. package com.extensibility.plugin;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.util.Enumeration;
  9. import java.util.Hashtable;
  10. import java.util.zip.ZipEntry;
  11. import java.util.zip.ZipFile;
  12.  
  13. class PluginClassLoader extends ClassLoader {
  14.    private Hashtable classes = new Hashtable();
  15.    private Hashtable unloadedClasses = new Hashtable();
  16.  
  17.    public String enumerateClasses(File var1) throws IOException {
  18.       ZipFile var2 = new ZipFile(var1);
  19.       Enumeration var3 = var2.entries();
  20.       String var4 = null;
  21.  
  22.       while(var3.hasMoreElements()) {
  23.          ZipEntry var5 = (ZipEntry)var3.nextElement();
  24.          String var6 = var5.getName();
  25.          String var7 = var6.toLowerCase();
  26.          if (var7.endsWith(".mf")) {
  27.             var4 = this.extractMainClassFromManifest(var2, var5);
  28.          } else {
  29.             String var8 = var5.getName();
  30.             if (var7.endsWith(".class")) {
  31.                var8 = var8.replace('/', '.');
  32.                var8 = var8.substring(0, var8.length() - 6);
  33.             }
  34.  
  35.             PluginClassInfo var9 = new PluginClassInfo((PluginClassLoader)null);
  36.             var9.file = var2;
  37.             var9.entry = var5;
  38.             this.unloadedClasses.put(var8, var9);
  39.          }
  40.       }
  41.  
  42.       return var4;
  43.    }
  44.  
  45.    protected String extractMainClassFromManifest(ZipFile var1, ZipEntry var2) throws IOException {
  46.       BufferedReader var3 = new BufferedReader(new InputStreamReader(var1.getInputStream(var2)));
  47.       String var4 = null;
  48.  
  49.       try {
  50.          boolean var5 = false;
  51.  
  52.          while(!var5) {
  53.             String var6 = var3.readLine();
  54.             if (var6.startsWith("Main-Class:")) {
  55.                var4 = var6.substring(11).trim();
  56.                var5 = true;
  57.             }
  58.          }
  59.       } catch (Exception var7) {
  60.       }
  61.  
  62.       var3.close();
  63.       return var4;
  64.    }
  65.  
  66.    protected byte[] loadClassData(String var1) {
  67.       Object var2 = this.unloadedClasses.get(var1);
  68.       byte[] var3 = null;
  69.       if (var2 != null) {
  70.          PluginClassInfo var4 = (PluginClassInfo)var2;
  71.          ZipEntry var5 = var4.entry;
  72.          int var6 = (int)var5.getSize();
  73.          var3 = new byte[var6];
  74.  
  75.          try {
  76.             InputStream var7 = var4.file.getInputStream(var5);
  77.             int var8 = 0;
  78.  
  79.             for(int var9 = 0; var6 > 0 && var9 >= 0; var8 += var9) {
  80.                var9 = var7.read(var3, var8, var6);
  81.                var6 -= var9;
  82.             }
  83.  
  84.             var7.close();
  85.          } catch (Exception var10) {
  86.             var3 = null;
  87.          }
  88.  
  89.          this.unloadedClasses.remove(var1);
  90.       }
  91.  
  92.       return var3;
  93.    }
  94.  
  95.    public InputStream getResourceAsStream(String var1) {
  96.       Object var2 = this.unloadedClasses.get(var1);
  97.       InputStream var3 = null;
  98.       if (var2 != null) {
  99.          PluginClassInfo var4 = (PluginClassInfo)var2;
  100.          ZipEntry var5 = var4.entry;
  101.  
  102.          try {
  103.             var3 = var4.file.getInputStream(var5);
  104.          } catch (IOException var7) {
  105.             var3 = null;
  106.          }
  107.       }
  108.  
  109.       if (var3 == null) {
  110.          var3 = super.getResourceAsStream(var1);
  111.       }
  112.  
  113.       return var3;
  114.    }
  115.  
  116.    public synchronized Class loadClass(String var1, boolean var2) throws ClassNotFoundException {
  117.       Class var3 = (Class)this.classes.get(var1);
  118.       if (var3 != null) {
  119.          return var3;
  120.       } else {
  121.          try {
  122.             var3 = super.findSystemClass(var1);
  123.             return var3;
  124.          } catch (Exception var7) {
  125.             if (var1.startsWith("java.")) {
  126.                throw new ClassNotFoundException();
  127.             } else {
  128.                byte[] var4 = this.loadClassData(var1);
  129.                if (var4 == null) {
  130.                   throw new ClassNotFoundException();
  131.                } else {
  132.                   try {
  133.                      var3 = ((ClassLoader)this).defineClass(var1, var4, 0, var4.length);
  134.                   } catch (Error var6) {
  135.                      throw var6;
  136.                   }
  137.  
  138.                   if (var2) {
  139.                      ((ClassLoader)this).resolveClass(var3);
  140.                   }
  141.  
  142.                   return var3;
  143.                }
  144.             }
  145.          }
  146.       }
  147.    }
  148. }
  149.